/* $Id: numeric.prg,v 1.0 2009/11/12 10:43:21 riztan Exp $*/
/*
	Copyright © 2009  Riztan Gutierrez <riztang@gmail.com>

   Este programa es software libre: usted puede redistribuirlo y/o modificarlo 
   conforme a los términos de la Licencia Pública General de GNU publicada por
   la Fundación para el Software Libre, ya sea la versión 3 de esta Licencia o 
   (a su elección) cualquier versión posterior.

   Este programa se distribuye con el deseo de que le resulte útil, pero 
   SIN GARANTÍAS DE NINGÚN TIPO; ni siquiera con las garantías implícitas de
   COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO DETERMINADO. Para más información, 
   consulte la Licencia Pública General de GNU.

   http://www.gnu.org/licenses/
*/
// Modificacion:  Riztan (Noviembre 2009)


#include "gclass.ch"
#include "proandsys.ch"

/** \file numeric.prg.
 *  \brief Detalle del contenido de \c "tools01.prg" 
 *  \author 
 *  \date 2009
 *  \remark Comentarios sobre "numeric.prg"
*/

// GLOBAL EXTERNAL oTepuy /** \var GLOBAL oTepuy. Objeto Principal oTepuy. */
memvar oTepuy


/** Funcion que devuelve el equivalente en palabras a una cantidad dada.
 *  \par nNumero Valor a tratar. 
 *  \par lMale  .t. (por defecto) devuelve texto en masculino, .f. femenino.
 *  \ret Cadena con el equivalente del numero en palabras.
 */
FUNCTION NumTOStr( nNumero, lMale )
   Local Long,val1,val2,val3,val4,x1x2x3,x2x3,x4x5,x1,x2,x3,x4,x5,conta1
   Local cTexto,cTexto1,parte2,parte3,parte4,parte5,parteA,Y,parteC
   Local totalX,totalA,total2,total3,n, p
   Local unidad, decena, dece1, dece2, cond, ciento, cCientos
   
   DEFAULT lMale := .t.

   /*
   *
   * GENERA EL JORNAL EN cTextoS
   * la variable que recibe del prog. principal es nNumero(numerica)
   * la variable que entrega la subrut. es cTexto(string)
   */
   
   
   *declaracion de variables de memoria*
   
   STORE "             uno          dos          tres         cuatro       cinco        "+;
         "seis         siete        ocho         nueve        " TO unidad
   
   STORE "             diez         veinte       treinta      cuarenta     cincuenta    "+;
         "sesenta      setenta      ochenta      noventa      " TO decena
   
   STORE "             once         doce         trece        catorce      quince       "+;
         "dieciseis    diecisiete   dieciocho    diecinueve   " TO dece1
   
   STORE "             veintiuno    veintidos    veintitres   veinticuatro veinticinco  "+;
         "veintiseis   veintisiete  veintiocho   veintinueve  " TO dece2
   
   STORE "             ciento                                              quinientos   "+;
         "             setecientos               novecientos  " TO ciento
   
   STORE "cientos" TO cCientos
   
   IF !lMale
      dece2   := STRTRAN( dece2   , "uno", "una")
      ciento  := STRTRAN( ciento  , "os" , "as" )
      unidad  := STRTRAN( unidad  , "uno", "una")
      cCientos:= STRTRAN( cCientos, "os" , "as" )
   ENDIF
   
   /* C/periodo tiene una longitud de 13 caracteres*/
   
   /* Calculo que transforma una exp. numerica en exp. literal*/
   
   STORE " " TO val1,val2,val3,val4
   STORE  0  TO x1x2x3,x2x3,x4x5,x1,x2,x3,x4,x5,conta1
   STORE " " TO cTexto,cTexto1,parte2,parte3,parte4,parte5
   STORE " " TO parteA,Y,parteC

   totalX := STR(INT(nNumero))
   totalA := LTRIM(totalX)
   long   := LEN(totalA)
   total2 := (REPLICATE("0",9 - long)) + totalA
   total3 := RIGHT(STR(nNumero,12,2),2)
   n := 13

   val1 := SUBSTR(total2,1,1)+SUBSTR(total2,2,1)+SUBSTR(total2,3,1)
   val2 := SUBSTR(total2,4,1)+SUBSTR(total2,5,1)+SUBSTR(total2,6,1)
   val3 := SUBSTR(total2,7,1)+SUBSTR(total2,8,1)+SUBSTR(total2,9,1)
   val4 := SUBSTR(total3,1,1)+SUBSTR(total3,2,1)


   DO CASE
      CASE VAL(val1) <> 0
           cond := 3
      CASE VAL(val2) <> 0
           cond := 2
      OTHERWISE
           cond := 1
   ENDCASE

   p := 1
   DO WHILE p <= cond
      DO CASE
         CASE p = 3
              x1x2x3 := INT(VAL(val1))
              x2x3   := INT(VAL(SUBSTR(val1,2,2)))
              x1     := INT(VAL(SUBSTR(val1,1,1)))
              x2     := INT(VAL(SUBSTR(val1,2,1)))
              x3     := INT(VAL(SUBSTR(val1,3,1)))
   *
         CASE p = 2
              x1x2x3 := INT(VAL(val2))
              x2x3   := INT(VAL(SUBSTR(val2,2,2)))
              x1     := INT(VAL(SUBSTR(val2,1,1)))
              x2     := INT(VAL(SUBSTR(val2,2,1)))
              x3     := INT(VAL(SUBSTR(val2,3,1)))
   *
         CASE p = 1
              x1x2x3 := INT(VAL(val3))
              x1     := INT(VAL(SUBSTR(val3,1,1)))
              x2     := INT(VAL(SUBSTR(val3,2,1)))
              x3     := INT(VAL(SUBSTR(val3,3,1)))
              x4x5   := INT(VAL(val4))
              x4     := INT(VAL(SUBSTR(val4,1,1)))
              x5     := INT(VAL(SUBSTR(val4,2,1)))
      ENDCASE
   *
      IF x1x2x3 <> 0
         DO CASE
            CASE x1x2x3 = 100
                 parteA := "CIEN"
            CASE x1 = 1 .OR. x1 = 5 .OR. x1 = 7 .OR. x1 = 9
                 parteA := RTRIM(SUBSTR(ciento,n*x1,n))
            CASE x1 = 2 .OR. x1 = 3 .OR. x1 = 4 .OR. x1 = 6 .OR. x1 = 8
                 parteA := RTRIM(SUBSTR(unidad,n*x1,n)) + cCIENTOS
            CASE x1 = 0
                 parteA := " "
         ENDCASE
   *
         DO CASE
            CASE x2>=3 .AND. x3<>0
                 parte2 := parteA+RTRIM(SUBSTR(decena,n*x2,n))+" Y"+RTRIM(SUBSTR(unidad,n*x3,n))
            CASE x2<>0 .AND. x3=0
                 parte2 := parteA+RTRIM(SUBSTR(decena,n*x2,n))
            CASE x2=2 .AND. x3<>0
                 parte2 := parteA+RTRIM(SUBSTR(dece2,n*x3,n))
            CASE x2=1 .AND. x3<>0
                 parte2 := parteA+RTRIM(SUBSTR(dece1,n*x3,n))
            CASE x2=0 .AND. X3<>0
                 parte2 := parteA+RTRIM(SUBSTR(unidad,n*x3,n))
            CASE x2=0 .AND. x3=0
                 parte2 := parteA
         ENDCASE
         IF p>1  .AND. x3=1 .AND. x2x3<>11
            Y := RTRIM(LTRIM(parte2))
            parteC := SUBSTR(Y,1,LEN(Y)-1)
         ENDIF
      ENDIF
      IF p=1
         DO CASE
            CASE VAL(val3)<>0 .AND. x4x5 <> 0
                 cTexto1 := TRIM(parte2)+" CON "+RTRIM(total3)+"/100 "
            CASE VAL(val3)<>0 .AND. x4x5=0
                 cTexto1 := LTRIM(parte2)
            CASE VAL(val3) = 0 .AND. x4x5 <> 0
                 cTexto1 := " CON "+RTRIM(total3)+"/100 "
            CASE VAL(val3) = 0 .AND. x4x5 = 0
                 cTexto1 := parte2
         ENDCASE
      ENDIF
   *
      IF p=2
         DO CASE
            CASE x3 = 1 .AND. x2x3<>11
                 parte4 := parteC+" MIL "
            CASE x1x2x3<>0
                 parte4=LTRIM(TRIM(parte2))+" MIL "
            CASE x1x2x3 = 0
                parte4 := " "
         ENDCASE
      ENDIF
    *
      IF p=3
         DO CASE
            CASE x1=0 .AND. x2=0 .AND. x3=1
                 parte5 := "UN MILLON "
            CASE x3=1 .AND. x2x3<>11
                 parte5 := parteC+" MILLONES "
            CASE x1x2x3<>0
                 parte5 := LTRIM(TRIM(parte2))+" MILLONES "
            CASE x1x2x3=0
                 parte5 := " "
         ENDCASE
      ENDIF
   *
      DO CASE
         CASE cond=1
              cTexto := IIF(VAL(val3) >=1 ,LOWER(cTexto1),LOWER(SUBSTR(cTexto1,6,LEN(cTexto1)-6)))
         CASE cond=2
              cTexto := LOWER(parte4+LTRIM(cTexto1))
         CASE cond=3
              cTexto := LOWER(parte5+LTRIM(parte4)+LTRIM(cTexto1))
      ENDCASE
      parte2 = " "
      parteC = " "
      Y = " "
      p = p + 1
   ENDDO WHILE

RETURN TokenUpper( UTF_LOWER( cTexto ) ) 


//-------------------------------------------------------------------



//EOF
